/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.ugc.cnel.manabi.bakenbeans;

import com.icesoft.faces.component.inputfile.FileInfo;
import com.icesoft.faces.component.inputfile.InputFile;
import com.icesoft.faces.context.effects.Highlight;
import com.icesoft.faces.context.effects.JavascriptContext;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.EventObject;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import oracle.toplink.essentials.ejb.cmp3.EntityManager;
import oracle.toplink.essentials.sessions.DatabaseLogin;
import org.ugc.cnel.manabi.entidades.TempUpload;
import org.ugc.cnel.manabi.entidades.Usuario;
import org.ugc.cnel.manabi.jpa.TempUploadJpaController;
import org.ugc.cnel.manabi.jpa.UsuarioJpaController;
import org.ugc.cnel.manabi.jpa.exceptions.IllegalOrphanException;
import org.ugc.cnel.manabi.jpa.exceptions.NonexistentEntityException;
import org.ugc.cnel.manabi.recursos.Utilidades;

/**
 *
 * @author Admin
 */
public class SesionBean {

    private Usuario usu_login;
    private static String pagina_login = "./../acceso.iface";
    private FileInfo archivoactual;
    private int archivoprogreso = -1;
    private Date fecha_actual = new Date();
    private int backupprogress = -1;
    private EntityManagerFactory emf;
    public static String ruta_backups = System.getenv("USERPROFILE");
    public List<Respaldos> respaldos = new ArrayList<Respaldos>();
    private boolean visible = false;
    private boolean panels[] = new boolean[5];
    private boolean manager;
    private boolean operator;
    private boolean secretari;
    private boolean administrator;

    public boolean[] getPanels() {
        return panels;
    }

    public void setPanels(boolean[] panels) {
        this.panels = panels;
    }

    public boolean isAdministrator() {
        return administrator;
    }

    public void setAdministrator(boolean administrator) {
        this.administrator = administrator;
    }

    public boolean isManager() {
        return manager;
    }

    public void setManager(boolean manager) {
        this.manager = manager;
    }

    public boolean isOperator() {
        return operator;
    }

    public void setOperator(boolean operator) {
        this.operator = operator;
    }

    public boolean isSecretari() {
        return secretari;
    }

    public void setSecretari(boolean secretari) {
        this.secretari = secretari;
    }

    public boolean isVisible() {
        return visible;
    }

    public void setVisible(boolean visible) {
        this.visible = visible;
    }

    public void abrirpopup(ActionEvent evt) {
        //System.out.println("Entrerotirpotipoertipoerit");
        setVisible(true);
        JavascriptContext.focus(FacesContext.getCurrentInstance(), "form_sistema:clave_nueva");
    }

    public void cierra(ActionEvent evt) {
        setVisible(false);
    }
    private String clavenueva, claverepita;

    public String getClavenueva() {
        return clavenueva;
    }

    public void setClavenueva(String clavenueva) {
        this.clavenueva = clavenueva;
    }

    public String getClaverepita() {
        return claverepita;
    }

    public void setClaverepita(String claverepita) {
        this.claverepita = claverepita;
    }

    public void cambiarclave(ActionEvent evt) {
        if (this.clavenueva.equals("") || this.claverepita.equals("")) {
            FacesMessage message = new FacesMessage();
            message.setDetail("Los campos no debeb estar en blanco");
            message.setSummary("Los campos no debeb estar en blanco");
            message.setSeverity(FacesMessage.SEVERITY_ERROR);
            FacesContext.getCurrentInstance().addMessage("form_sistema:clave_nueva", message);
            JavascriptContext.fireEffect(new Highlight("#fda505"), "form_sistema:clave_nueva", FacesContext.getCurrentInstance());
            JavascriptContext.fireEffect(new Highlight("#fda505"), "form_sistema:clave_repita", FacesContext.getCurrentInstance());
            return;
        }
        if (!this.clavenueva.equals(claverepita)) {
            FacesMessage message = new FacesMessage();
            message.setDetail("Las Claves Ingresadas deben ser iguales");
            message.setSummary("Las Claves Ingresadas deben ser iguales");
            message.setSeverity(FacesMessage.SEVERITY_ERROR);
            FacesContext.getCurrentInstance().addMessage("form_sistema:clave_nueva", message);
            JavascriptContext.fireEffect(new Highlight("#fda505"), "form_sistema:clave_nueva", FacesContext.getCurrentInstance());
            JavascriptContext.fireEffect(new Highlight("#fda505"), "form_sistema:clave_repita", FacesContext.getCurrentInstance());
            return;
        }
        UsuarioJpaController usujpa = (UsuarioJpaController) FacesContext.getCurrentInstance().getApplication().getELResolver().getValue(FacesContext.getCurrentInstance().getELContext(), null, "UsuarioJPA");
        try {
            usu_login.setClave(Utilidades.md5(clavenueva));
            usujpa.edit(usu_login);
            JavascriptContext.addJavascriptCall(FacesContext.getCurrentInstance(), ";alert('Clave Modificada con exito');");
        } catch (IllegalOrphanException ex) {
            Logger.getLogger(SesionBean.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NonexistentEntityException ex) {
            Logger.getLogger(SesionBean.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(SesionBean.class.getName()).log(Level.SEVERE, null, ex);
        }
        setVisible(false);
    }

    public void respalda(ActionEvent evt) {
        this.backupprogress = -1;
        try {
            emf = Persistence.createEntityManagerFactory("UGC_CNELPU");
            oracle.toplink.essentials.ejb.cmp3.EntityManager entityManager = (EntityManager) emf.createEntityManager();
            DatabaseLogin login = entityManager.getServerSession().getLogin();
            String path = ruta_backups + "\\backupcrm" + new SimpleDateFormat("yyyyMMddHHmm").format(new Date()) + ".backup";
            Runtime r = Runtime.getRuntime();


            //PostgreSQL variables
            String user = login.getUserName();
            String dbase = "UGC_CNEL";
            String password = login.getPassword();
            Process p;
            ProcessBuilder pb;
            emf.close();
            /**
             * Ejecucion del proceso de respaldo
             */
            r = Runtime.getRuntime();
            pb = new ProcessBuilder(System.getenv("ProgramFiles") + "\\PostgreSQL\\8.4\\bin\\pg_dump", "-v", "-f", path, "-U", user, dbase);
            pb.environment().put("PGPASSWORD", "adminadmin");
            pb.redirectErrorStream(true);
            p = pb.start();
            try {
                int bite = p.getInputStream().read();
                while ((bite) != -1) {
                    //System.out.println(bite);
                    bite = p.getInputStream().read();

                }
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println(p.getInputStream().toString());
            //System.out.println("OJOJOJOJO" + console);
            File temp = new File(path);
            this.respaldos.add(new Respaldos(temp.getName(), temp.getPath(), String.valueOf(temp.length() / 1024) + " Kb"));
            this.backupprogress = 100;
        } catch (Exception ex) {
            Logger.getLogger(this.toString()).log(Level.SEVERE, "Error en respaldo", ex);
        }
    }

    public List<Respaldos> getRespaldos() {
        return respaldos;
    }

    public void setRespaldos(List<Respaldos> respaldos) {
        this.respaldos = respaldos;
    }

    public int getBackupprogress() {
        return backupprogress;
    }

    public void setBackupprogress(int backupprogress) {
        this.backupprogress = backupprogress;
    }

    public Date getFecha_actual() {
        return fecha_actual;
    }

    public void setFecha_actual(Date fecha_actual) {
        this.fecha_actual = fecha_actual;
    }

    public Usuario getUsu_login() {
        return usu_login;
    }

    public void setUsu_login(Usuario usu_login) {
        this.usu_login = usu_login;
    }

    public FileInfo getArchivoactual() {
        return archivoactual;
    }

    public void setArchivoactual(FileInfo archivoactual) {
        this.archivoactual = archivoactual;
    }

    public int getArchivoprogreso() {
        return archivoprogreso;
    }

    public void setArchivoprogreso(int archivoprogreso) {
        this.archivoprogreso = archivoprogreso;
    }

    /** Creates a new instance of SesionBean */
    public SesionBean() {
        // Recoger los Objetos de la Sesion
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            if (usu_login == null) {
                Usuario obj = (Usuario) context.getExternalContext().getSessionMap().get("usu_login");

                if (obj == null) {
                    // Redireccionar al usuario sin permisos
                    try {
                        cerrar_sesion(null);
                    } catch (Exception ex) {
                        Logger.getLogger(SesionBean.class.getName()).log(Level.SEVERE, "No se pudo redireccionar", ex);
                        // en Caso que no pueda Redireccionar
                        HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
                        response.sendError(response.SC_UNAUTHORIZED, "Usuario No Autorizado");
                    }
                } else {
                    setUsu_login(obj);
                    this.operator = (usu_login.getRolUsuarioCollection().iterator().next().getIdRol().getNivel() == 1);
                    this.secretari = (usu_login.getRolUsuarioCollection().iterator().next().getIdRol().getNivel() == 2);
                    this.manager = (usu_login.getRolUsuarioCollection().iterator().next().getIdRol().getNivel() == 3);
                    this.administrator = (usu_login.getRolUsuarioCollection().iterator().next().getIdRol().getNivel() == 4);
                    //AuditBakenBean.audit(AuditBakenBean.tipomensaje.ACCESAR, "El usuario Ingreso al sistema");
                }
            }
        } catch (Exception ex) {
            Logger.getLogger(SesionBean.class.getName()).log(Level.SEVERE, "Excepcion en el constructor del Bean", ex);
        }
        //cargar los backups
        File dir_back = new File(SesionBean.ruta_backups);
        File[] file_bak = dir_back.listFiles(new FileFilter() {

            public boolean accept(File pathname) {
                if (pathname.getName().lastIndexOf(".backup") != -1) {
                    return true;
                }
                return false;

            }
        });
        for (File file : file_bak) {
            this.respaldos.add(new Respaldos(file.getName(), file.getPath(), String.valueOf(file.length() / 1024) + " Kb"));
        }
    }

    public void cerrar_sesion(ActionEvent evt) {
        // Invalidar Sessiones
        FacesContext context = FacesContext.getCurrentInstance();
        ExternalContext ec = context.getExternalContext();
        HttpServletRequest request = (HttpServletRequest) ec.getRequest();

        // Redireccionar al acceso
        try {
            //Elimnar la Session del Usuario
            context.getExternalContext().getSessionMap().remove("usu_login");
            usu_login = null;
            request.getSession(false).invalidate();
            context.getExternalContext().redirect(SesionBean.pagina_login);
        } catch (Exception ex) {
            Logger.getLogger(SesionBean.class.getName()).log(Level.SEVERE, "No se pudo redireccionar", ex);
            // en Caso que no pueda Redireccionar
            HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
            try {
                response.sendError(response.SC_UNAUTHORIZED, "Usuario No Autorizado");
            } catch (IOException ex1) {
                Logger.getLogger(SesionBean.class.getName()).log(Level.SEVERE, null, ex1);
            }
        }
    }

    public void subirActionListener(ActionEvent evt) {
        InputFile inputFile = (InputFile) evt.getSource();
        FacesContext facesContext = FacesContext.getCurrentInstance();
        archivoactual = inputFile.getFileInfo();

        if (archivoactual.isSaved()) {
            TempUploadJpaController tempupload = (TempUploadJpaController) facesContext.getApplication().getELResolver().getValue(facesContext.getELContext(), null, "tempuploadJPA");
            if (tempupload != null) {
                TempUpload temp = new TempUpload(new Integer(0), Utilidades.getSessionID(), archivoactual.getFileName(), new Date(), archivoactual.getPhysicalPath());
                tempupload.create(temp);
            }
        }
        try {
            //Refrescar la Grilla de Archivos Adjuntos
            ((inspeccionBakenBean) facesContext.getApplication().getELResolver().getValue(facesContext.getELContext(), null, "inspeccionBakenBean")).getTempuploadlist();
            //Refrescar la grilaa de Archivos Adjuntos en edicion
            ((editInspeccionBakenBean) facesContext.getApplication().getELResolver().getValue(facesContext.getELContext(), null, "editInspeccionBakenBean")).getAdjuntos();
        } catch (Exception e) {
            Logger.getLogger(SesionBean.class.getName()).log(Level.SEVERE, e.getMessage());
        }
    }

    public void progresoActionListener(EventObject evt) {
        InputFile ifile = (InputFile) evt.getSource();
        archivoprogreso = ifile.getFileInfo().getPercent();
    }

    public void tooglePanel(ActionEvent evt) {
        if (evt.getComponent().getId().equals("inspecciones")) {
            panels[0] = !panels[0];
        }
        if (evt.getComponent().getId().equals("clientes")) {
            panels[1] = !panels[1];
        }
        if (evt.getComponent().getId().equals("tablas")) {
            panels[2] = !panels[2];
        }
        if (evt.getComponent().getId().equals("usuarios_roles")) {
            panels[3] = !panels[3];
        }
        if (evt.getComponent().getId().equals("mantenimiento")) {
            panels[4] = !panels[4];
        }
    }
}
